package processor;


import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * @author jiang
 */
public interface AnnotationProcessor<A extends Annotation> {


    /**
     * 设置自定义注解
     *
     * @return
     */
    Class<A> targetAnnotation();

    /**
     * 若注解作用在类上类初始化做的操作
     *
     * @param a
     * @param bean
     */
    void classInit(Class<A> a, Object bean);

    /**
     * 若注解在字段上字段填充做的操作
     *
     * @param a
     * @param bean
     * @param field
     */
    void fieldInit(Class<A> a, Object bean, Field field, Object o);

    /**
     * 若注解在方法上方法前做的操作
     *
     * @param a
     * @param bean
     * @param method
     * @param parameters
     */
    void methodBefore(Class<A> a, Object bean, Method method, Object[] parameters);

    /**
     * 若注解在方法上方法后做的操作
     *
     * @param a
     * @param bean
     * @param method
     * @param ret
     * @return
     */
    Object methodAfter(Class<A> a, Object bean, Method method, Object ret);

    /**
     * 若注解在参数上做的操作
     *
     * @param a
     * @param bean
     * @param method
     * @param parameter
     * @param o
     * @return
     */
    Object parameterInit(Class<A> a, Object bean, Method method, Parameter parameter, Object o);
}

